package com.dongbao.core.rules.java;

import com.dongbao.core.base.CodeRulesCommonBase;
import com.dongbao.core.rules.CodeRulesBase;
import com.dongbao.entity.AwardedInfo;
import com.dongbao.util.ToolUtil;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.PsiClassImpl;
import com.intellij.psi.impl.source.tree.PsiCommentImpl;
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 *  必须使用了多语言设置
 * */
public class MultilingualRules extends CodeRulesCommonBase implements CodeRulesBase {

    public MultilingualRules(VirtualFile afterFile,PsiFile psiFile,Project project) {
        super(afterFile,psiFile,project);
        this.code = "A011";
        this.level = "A";
    }

    /**
     * 执行规则判断
     * */
    @Override
    public void run(List<AwardedInfo> deduction) {
        super.runAllExpressionRow(deduction);
    }

    @Override
    public void validExpUse(PsiElement elementRow, List<AwardedInfo> deduction, PsiClassImpl psiClass, PsiMethod method){
        String text = elementRow.getText();
        if(ToolUtil.isContainChinese(text) && text.indexOf("log.error")==-1 && text.indexOf("log.info")==-1 ){
        /* 获取错误代码行位置 */
            Document document = PsiDocumentManager.getInstance(psiClass.getProject()).getDocument(psiClass.getContainingFile());
            int lineNumber = document.getLineNumber(elementRow.getTextOffset());

            String reg = "[^\u4e00-\u9fa5]";
            String txt = text.replaceAll(reg, "");



            packDeduction(
                    deduction,
                    psiClass.getName(),
                    psiPackageStatements.get(0).getPackageName(),
                    "",
                    String.format("类中声明的变量[%s]赋值中存在中文字符,请使用多语言管理进行转换语言",txt),lineNumber,lineNumber);
        }
    }

//    /**
//     * 执行规则判断
//     * */
//    @Override
//    public void run(List<AwardedInfo> deduction) {
//        /* 执行分析当前class是否负责当前规则 */
//        PsiAnnotation[] annotations = psiClassImpls.get(0).getModifierList().getAnnotations();
//        for(PsiClassImpl psiClass:psiClassImpls){
//
//            /* 判断类中声明的变量是否存在中文 */
//            PsiField[] allFields = psiClass.getAllFields();
//            if(allFields.length>0){
//                for(Integer i=0;i<allFields.length;i++){
//                    if("PsiType:String".equals(allFields[i].getType().toString())){
//                        PsiElement valueExpression = Arrays.stream(allFields[i].getChildren()).filter(item -> item instanceof PsiLiteralExpressionImpl).findAny().orElse(null);
//                        if(valueExpression!=null){
//                            String text = valueExpression.getLastChild().getText();
//                            if(ToolUtil.isContainChinese(text)){
//
//                                /* 获取错误代码行位置 */
//                                Document document = PsiDocumentManager.getInstance(psiClass.getProject()).getDocument(psiClass.getContainingFile());
//                                int lineNumber = document.getLineNumber(valueExpression.getTextOffset());
//
//                                packDeduction(
//                                        deduction,
//                                        psiClass.getName(),
//                                        psiPackageStatements.get(0).getPackageName(),
//                                        "",
//                                        String.format("类中声明的变量[%s]赋值中存在中文字符,请使用多语言管理进行转换语言",allFields[i].getName()),lineNumber,lineNumber);
//                            }
//                        }
//
//                    }
//                }
//            }
//
//            /* 判断方法中是否存在中文 */
//            PsiMethod[] allMethods = psiClass.getMethods();
//            for(PsiMethod method:allMethods){
//                List<PsiElement> psiElement = Arrays.stream(method.getBody().getChildren()).filter(item -> {
//                    return !(item instanceof PsiCommentImpl);
//                }).collect(Collectors.toList());
//                String methodBody = psiElement.stream().map(PsiElement::getText).collect(Collectors.joining());
//                /* 判断方法体内是否包含中文 */
//                if(ToolUtil.isContainChinese(methodBody)){
//
//                    /* 获取错误代码行位置 */
//                    Document document = PsiDocumentManager.getInstance(psiClass.getProject()).getDocument(psiClass.getContainingFile());
//                    int lineNumber = document.getLineNumber(method.getTextOffset());
//
//                    packDeduction(
//                            deduction,
//                            psiClass.getName(),
//                            psiPackageStatements.get(0).getPackageName(),
//                            method.getName(),
//                            String.format("方法中存在中文字符,请使用多语言管理进行转换语言"),lineNumber,lineNumber);
//                }
//
//            }
//        }
//    }

    @Override
    public String describe() {
        return "系统公共方法和工具类";
    }
}
